/**
 * 进程参数:初始化及取得
 * 		- 传入有空格需加引号, key限制:[a-zA-Z0-9_]
 * 		- 若多个同参数名,后顶掉前, 其他顺序不限
 * 主参数:  字符串  取得:'-'
 * 		传入方式1: `{val}`  限制:不含'=',开始不能'-'
 * 		传入方式2: `-={val}`  值:可含'=',开始可为'-'
 * 		传入方式3: `-`或`-=`  值为:''
 * 布尔值:  若传参,值为true,否则false  传入方式:
 * 		短参数: `-{ks}` 参数{ks}的每个字符为{k}  取得:'-{k}'
 * 		长参数: `--{key}` 参数{key}单个或多字符  取得:'--{key}'
 * 字符值:  参数{key}单个或多个字符  取得:'{key}'
 * 		传入方式: `{key}={val}` 值{val}可含'='
 * @param key string|null 取得的KEY  null:全部
 * @param ign boolean [非布尔值]是否忽略无参数key异常
 * @return boolean|string|null  null:无key且ign时
 */
$.args = function(key, ign=true){
	if(!key) return $.__args;
	if($.__args[key]!==undefined) return $.__args[key];
	if(key && key!=='-' && key[0]==='-') return false;
	if(!ign) $.err('$.args.key.must',key); return null;
};
Object.defineProperty($, '__args', {
	value:(function(){ // 初始化解析进程参数
		let ARGS={}, REG=/^[a-z0-9_]+$/i;
		const ONE = function(k, v, n){
			if(REG.test(n?k.slice(n):k)) ARGS[k]=v;
			else $.err('$.args.key.pattern', k);
		};
		process.argv.slice(2).forEach(V=>{
			if(V==='-' || V==='-=') ARGS['-']='';
			else if(V.charAt(0)!=='-'){
				let [k,...v] = V.split('=');
				if(!v.length) ARGS['-'] = V;
				else ONE(k, v.join('='), 0);
			}
			else if(V.charAt(1)==='=') ARGS['-']=V.slice(2);
			else if(V.charAt(1)==='-') ONE(V, true, 2);
			else{
				for(let i=1; i<V.length; i++)
					ONE('-'+V.charAt(i),true,1);
			}
		});
		return ARGS;
	})(),
});
